--- /dev/null
+#
+# Copyright (C) 2013-2014 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=xupnpd
+PKG_REV:=399
+PKG_VERSION:=$(PKG_REV)
+PKG_RELEASE:=1
+
+PKG_SOURCE_PROTO:=svn
+PKG_SOURCE_VERSION:=$(PKG_REV)
+PKG_SOURCE_SUBDIR:=xupnpd-$(PKG_VERSION)
+PKG_SOURCE_URL:=http://tsdemuxer.googlecode.com/svn/trunk/xupnpd/src/
+PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz
+
+include $(INCLUDE_DIR)/package.mk
+
+LUA_FLAGS:=-llua
+
+define Build/Compile
+ (cd $(PKG_BUILD_DIR); $(TARGET_CC) -v $(LUA_FLAGS) $(TARGET_CFLAGS) -fno-exceptions -fno-rtti -DWITH_URANDOM $(TARGET_CPPFLAGS) $(TARGET_LDFLAGS) -lm -ldl -lcrypt -o xupnpd *.c *.cpp)
+endef
+
+define Package/xupnpd
+ SECTION:=multimedia
+ CATEGORY:=Multimedia
+ DEPENDS:=+liblua
+ TITLE:=eXtensible UPnP agent
+ URL:=http://xupnpd.org/
+endef
+
+define Package/xupnpd/conffiles
+/usr/share/xupnpd/xupnpd.lua
+/usr/share/xupnpd/config
+/usr/share/xupnpd/playlists
+endef
+
+define Package/xupnpd/description
+xupnpd - eXtensible UPnP agent
+This program is a light DLNA Media Server which provides ContentDirectory:1 service for sharing IPTV unicast streams over local area network (with udpxy for multicast to HTTP unicast conversion).
+The program shares UTF8-encoded M3U playlists with links over local area network as content of the directory.
+You can watch HDTV broadcasts (multicast or unicast) and listen Internet Radio in IP network without transcoding and PC.
+endef
+
+define Package/xupnpd/install
+ $(INSTALL_DIR) $(1)/usr/bin
+ $(INSTALL_BIN) $(PKG_BUILD_DIR)/xupnpd $(1)/usr/bin
+ $(INSTALL_DIR) $(1)/etc/init.d
+ $(INSTALL_BIN) ./files/xupnpd.init $(1)/etc/init.d/xupnpd
+ $(INSTALL_DIR) $(1)/usr/share/xupnpd
+ $(CP) $(PKG_BUILD_DIR)/*.lua $(1)/usr/share/xupnpd
+ $(INSTALL_DIR) $(1)/usr/share/xupnpd/ui
+ $(CP) $(PKG_BUILD_DIR)/ui/* $(1)/usr/share/xupnpd/ui
+ $(INSTALL_DIR) $(1)/usr/share/xupnpd/www
+ $(CP) $(PKG_BUILD_DIR)/www/* $(1)/usr/share/xupnpd/www
+ $(INSTALL_DIR) $(1)/usr/share/xupnpd/playlists
+ $(INSTALL_DIR) $(1)/usr/share/xupnpd/plugins
+ $(CP) $(PKG_BUILD_DIR)/plugins/* $(1)/usr/share/xupnpd/plugins
+ $(INSTALL_DIR) $(1)/usr/share/xupnpd/config
+ $(INSTALL_DIR) $(1)/etc/xupnpd
+ (cd $(1)/etc/xupnpd; ln -s ../../usr/share/xupnpd/config ./; ln -s ../../usr/share/xupnpd/xupnpd.lua ./)
+ $(INSTALL_DIR) $(1)/usr/share/xupnpd/localmedia
+endef
+
+$(eval $(call BuildPackage,xupnpd))
--- /dev/null
+--- a/main.cpp
++++ b/main.cpp
+@@ -4,11 +4,14 @@
+ * https://tsdemuxer.googlecode.com/svn/trunk/xupnpd
+ */
+
++#include <ctype.h>
+ #include <stdio.h>
+ #include <syslog.h>
+ #include <string.h>
+ #include <unistd.h>
+ #include <stdlib.h>
++#include <sys/stat.h>
++#include <sys/types.h>
+ #include "luacompat.h"
+ #include "luaxlib.h"
+ #include "luaxcore.h"
+@@ -16,35 +19,36 @@
+
+ int main(int argc,char** argv)
+ {
+- const char* p=strrchr(argv[0],'/');
+-
+- int rc;
+-
+- if(p)
+- {
+- char location[512];
+- int n=p-argv[0];
+- if(n>=sizeof(location))
+- n=sizeof(location)-1;
+- strncpy(location,argv[0],n);
+- location[n]=0;
+-
+- rc=chdir(location);
+-
+- argv[0]=(char*)p+1;
+- }
+-
+- const char* root=getenv("XUPNPDROOTDIR");
+- if(root && *root)
+- rc=chdir(root);
+-
+- {
+- FILE* fp=fopen("xupnpd.lua","r");
+- if(fp)
+- fclose(fp);
+- else
+- rc=chdir("/usr/share/xupnpd/");
+- }
++ int c;
++ char *xupnpd_root = "/usr/share/xupnpd/";
++ struct stat s;
++
++ opterr = 0;
++ while ((c = getopt (argc, argv, "d:")) != -1) {
++ switch (c) {
++ case 'd':
++ xupnpd_root = optarg;
++ break;
++ case '?':
++ if (optopt == 'd')
++ fprintf(stderr, "Option -%c requires an argument.\n", optopt);
++ else if (isprint(optopt))
++ fprintf(stderr, "Unknown option \"-%c\".\n", optopt);
++ else
++ fprintf(stderr, "Unknown option\n");
++ return 1;
++ default:
++ abort();
++ }
++ }
++
++ if(stat(xupnpd_root, &s) != -1 && S_ISDIR(s.st_mode)) {
++ c = chdir(xupnpd_root);
++ }
++ else {
++ fprintf(stderr, "Directory %s doesn't exist.\n", xupnpd_root);
++ return 1;
++ }
+
+ lua_State* L=lua_open();
+ if(L)